<?php
	class Code{
		//画布   宽度  高度  背景颜色  文字颜色  文字大小  文字字体  验证码文字数量  种子
		//abcdefghijkls12324345342  
		private $res;//画布
		private $bgColor;//画布背景颜色 
		private $fontSize;//文字大小
		private $fontColor;//文字颜色
		private $font;//字体文件
		private $num;//验证码文字数量
		private $width;//画布宽度
		private $height;//画布高度
		private $codeStr;//种子字符串
		private $fontColorRes;//通过imagecolorallocate()创建的颜色 颜色
		//构造函数
		//$options=array("bgcolor","font")
		public function __construct($options=array()){
			$this->codeStr = isset($options['codestr'])?$options['codestr']:"abcdefghijklmnopqrstuvwsyz1234567890";//随机种子
			$this->font =  isset($options['font'])?$options['font']:"font/simhei.ttf";//字体
			$this->fontSize =  isset($options['fontsize'])?$options['fontsize']:16;//字体大小
			$this->num =  isset($options['num'])?$options['num']:5;//验证码文字个数
			$this->fontColor =  isset($options['fontcolor'])?$options['fontcolor']:null;//文字颜色
			$this->width =  isset($options['width'])?$options['width']:100;//宽度
			$this->height =  isset($options['height'])?$options['height']:30;//验证码高度
			$this->bgColor = isset($options['bgcolor'])?$options['bgcolor']:"#dcdcdc";//背景颜色
		}
		//显示验证码
		public function show(){
			$this->create();//创建画布
			$this->createFont();//写验证码文字
			$this->createLine();//画线
			header("Content-type:image/png");
			imagepng($this->res);
		}
		//绘制线
		private function createLine(){
			for($i=0;$i<3;$i++){
				imageline(
					$this->res,
					mt_rand(0,$this->width),mt_rand(0,$this->height),
					mt_rand(0,$this->width),mt_rand(0,$this->height),
					$this->fontColorRes);
			}
			//绘制杂色
			for($i=0;$i<100;$i++){
				imagesetpixel($this->res, mt_rand(0,$this->width),
				 mt_rand(0,$this->height),
					$this->fontColorRes);
			}
			for($i=0;$i<2;$i++){
				imagerectangle($this->res,
					mt_rand(0,$this->width),mt_rand(0,$this->height),
					mt_rand(0,$this->width),mt_rand(0,$this->height),
					 $this->fontColorRes);
			}
		}
		//创建画布
		private function create(){
			$res = imagecreatetruecolor($this->width, $this->height);//创建真彩色画布
			$colors = $this->getColor($this->bgColor);//获得背景颜色的10进制表示
			$bgColor = imagecolorallocate($res, $colors[0], $colors[1], $colors[2]);//定义画布颜色
			$black = imagecolorallocate($res, 0, 0, 0);//定义黑色，用于边框
			imagefill($res, 0, 0, $bgColor);//填充颜色
			imagerectangle($res, 0, 0, $this->width-1, $this->height-1, $black);//边线
			$this->res = $res;//资源
		}
		//获得验证码字符串
		private function getCodeStr(){
			$code = "";
			for($i=0;$i<$this->num;$i++){
				$index = mt_rand(0,strlen($this->codeStr)-1);//验证码种子长度间的一个随机数  20  0 19
				$code.=$this->codeStr[$index];//连接出验证码字符
			}
			$_SESSION['code']=strtoupper($code);//把验证存入SESSION，用于客户端验证使用
			return strtoupper($code);
		}
		//写入验证码文字
		private function createFont(){
			$fontColor = null;//文字颜色
			//如果指定了文字颜色，设置颜色
			if($this->fontColor){
				$colors = $this->getColor($this->fontColor);//获得文字颜色数组
				$fontColor = imagecolorallocate($this->res,  $colors[0], $colors[1], $colors[2]);//定义文字颜色
			}
			$codeStr = $this->getCodeStr();//获得验证码文字
			$w = $this->width/$this->num;//每个字占用的宽度
			//向画布写入文字
			for($i=0;$i<$this->num;$i++){
				//如果文字没有指定颜色，那么文字颜色就是随机的颜色
				if(!$this->fontColor){
					$fontColor = imagecolorallocate($this->res, mt_rand(50,135), mt_rand(50,135), mt_rand(50,135));
				}
				imagettftext($this->res, mt_rand($this->fontSize-2, $this->fontSize+2),
					mt_rand(-30,30), 
					$w*$i+5, 
					mt_rand($this->height/1.4,$this->height-5), 
					$fontColor, 
					$this->font, $codeStr[$i]);
			}
			$this->fontColorRes = $fontColor;
		}
		//将16进制颜色转为10进制  #ffffff  => array(255,255,255)
		private function getColor($color){
			$color = trim($color,"#");//去除#号
			return array(
				hexdec(substr($color,0,2)),//红色
				hexdec(substr($color,2,2)),//红色
				hexdec(substr($color,4,2)),//红色
			);
		}
	}
?>
